PulseDex senses one signal — the beat-to-beat RR interval — and turns it into a full HRV suite. Because it works on genuine RR (not a 1 Hz proxy), its time/frequency/Poincaré metrics are validated HRV, the same family ECGDex produces.
Read the suite as a reflex arc: receptors → relay → integration → insight. PulseDex is an afferent receptor — it does exactly one transduction well and reports inward. It never reaches into another node; cross-signal work happens only through the Ganglior export, consumed by the Integrator.
PulseDex is built from external *.js files referenced by PulseDex.src.html and bundled to a standalone PulseDex.html. Dependencies point downhill only — UI → DSP → Core — and each file owns exactly one job. Edit the .js + .src.html, never the bundle; re-bundle after changes.
buildHash provenance stamp). 100% local.crossNight() stats stay per-node).tMs (local civil time encoded as if UTC) and reads it back with getUTC* — so the recording reads identically in any viewer’s timezone, and two devices recording the same minute land on the same tMs. parseTimestamp is duplicated locally by design.The pipeline is the same shape across the suite: ingest → parse on the canonical clock → compute in DSP → grade & render in UI → emit onto the bus. No number is computed in the render layer; it asks DSP for the value and the registry for how to show it.
Drop a beat-to-beat RR file or a Welltory export. PulseDex auto-classifies the recording type.
Timestamps become floating tMs; ectopic/missed beats are detected and corrected before any HRV is computed.
Time-domain, Lomb–Scargle frequency-domain (handles uneven sampling), Poincaré, DFA α1, SampEn, fragmentation and PRSA — all from real RR.
Render draws KPIs, ANS bars and tables; the overview projects ANS-age / VO₂max against the user profile. Edits re-derive live via reRender().
Export the node-export JSON so the Integrator can fuse PulseDex HRV with oximetry and glucose.
Every metric PulseDex surfaces carries an evidence grade — a non-hue badge whose fill is the confidence ladder: solid bullseye for a raw reading, down to a dashed ring for a friendly estimate. A measurement and a projection must never look alike. Grades live in pulsedex-registry.js, the one source of truth.
Honesty is architectural: a guess is never dressed as a measurement, a missing value stays null rather than fabricated, and confidence is kept separate from signal quality. The node-specific caveats:
When fed wrist-optical pulse intervals, accuracy drops under movement. ECG RR is the more precise source; PulseDex flags low-quality stretches.
Because the input is true beat-to-beat timing, the core HRV family is graded validated — the key distinction from OxyDex’s pulse-rate proxies.
ANS-age, VO₂max and BP are heuristic projections from HRV — useful as a personal trend, not a clinical value.
Frequency-domain HRV uses Lomb–Scargle, so it tolerates the irregular spacing inherent to a beat series rather than forcing resampling.
PulseDex is one self-contained file. Open PulseDex.html in any browser — online, offline, or from file://. Nothing installs, nothing phones home.
Drag a Polar Verity Sense export (rr csv) onto the upload zone. It’s read in-browser and turned into metrics on your device alone.
Start in Core for the headline readiness and a plain-language line. Step up to Advanced for full tables and charts, or Research for composites and the full dump. Each metric’s evidence dot tells you how far to trust it.
Export a ganglior.node-export JSON to feed the Integrator, or to upgrade a peer node’s read. Events carry a wall-clock t; consumers reconstruct absolute time from the recording start.
Edit the pulsedex-*.js files or PulseDex.src.html — never the bundled PulseDex.html — then re-bundle. Run Dex-Test-Suite.html until all-green, and verify-provenance.html after re-bundling.